/**
 * Classe du moteur du jeu
 */
function Moteur() {
    this.io = new IO(this);
    this.inter = new Inter(this);
    
    this.etat = "login";
    this.nomJoueur = null;
    this.idPartie = null;
    this.dernierEvenement = 0;
    this.actions = [];
    this.inter.cacherChargement();
    this.inter.afficherLogin();
    this.io.sendMessages();
    this.execAction();
// */
/*
     this.inter.afficherVue('partie');
     this.inter.afficherNouveauJoueur('lol', 0)
     this.inter.afficherNouveauJoueur('lol', 1)
     this.inter.afficherNouveauJoueur('lol', 2)
     this.inter.afficherNouveauJoueur('lol', 3)//*/
}

/**
 * Traite les données reçues du serveur
 */
Moteur.prototype.answerProcess = function(data) {
    try {
        var actions = JSON.parse(data);
    } catch(e) {
        alert("ERROR DANS LA MATRICE :\n"+data);
    }
    this.actions = this.actions.concat(actions);
    for(var i in actions) {
        var action = actions[i];
        if(typeof action.id_evenement != 'undefined') this.updateEvenement(action.id_evenement);
    }
    switch(this.etat) {
        case "login":
            this.inter.afficherLogin();
            break;
        case "liste_parties":
            this.io.pushActionRecupListeParties();
            break;
        case "partie_en_cours":
            this.io.pushActionEtatPartie(this.idPartie, this.dernierEvenement);
            break;
    }
    this.io.sendMessages();
}

/**
 * Exec action
 */
Moteur.prototype.execAction = function() {
    var action = this.actions.shift();
    var tempo = 0;
    if(typeof action != 'undefined') {
        console.log(action);
        switch(action.action) {
            case "connecter_serveur":
                if(action.ok == 1) {
                    this.io.token = action.token;
                    this.etat = "liste_parties";
                }
                else {
                    this.inter.afficherErreurLogin();
                    this.inter.afficherNotification('Ce nom est déjà utilisé');
                }
                break;
            case "recup_liste_parties":
                if(action.ok == 1) {
                    this.inter.afficherParties(action.liste_parties);
                }
                break;
            case "creer_partie":
                if(action.ok == 1) {
                    this.chargerPartie(action.id_partie);
                }
                else {
                    this.inter.afficherNotification('Ce nom de partie est déjà utilisé');
                }
                break;
            case "rejoindre_partie":
                if(action.ok == 1) {
                    this.inter.afficherPartie(action.place, action.liste_joueurs);
                    this.etat = "partie_en_cours";
                }
                else {
                    this.inter.afficherNotification('La partie est pleine, veuillez en sélectionner une autre');
                    this.etat = "liste_parties";
                    this.inter.cacherChargement();
                }
                break;
            case "nouveau_joueur":
                this.inter.afficherNouveauJoueur(action.nom_joueur, action.place);
                break;
            case "mouvement_carte":
                this.inter.afficherMouvementCarte(action.de, action.vers, action.id_carte);
                tempo = 100;
                break;
            case "tour_de":
                this.inter.afficherTourDe(action.de);
                break;
            case "event_commencer_partie":
                this.inter.afficherCommencementPartie();
                break;
            case "supprimer":
                if(action.ok == 1) {
                    this.etat = "liste_parties";
                    this.inter.cacherChargement();
                }
                break;
            case "supprimer_joueur":
                this.inter.afficherSupprimerJoueur(action.place, action.nom_joueur);
                break;
            case "choisir_couleur":
                this.inter.afficherChoisirCouleur(action.place);
                break;
            case "changement_couleur":
                this.inter.afficherChangementCouleur(action.couleur);
                break;
            case "partie_terminee":
                this.etat = "partie_terminee";
                this.inter.afficherPartieTerminee(action.nom);
                break;
            case "event_chat":
                this.inter.afficherMessage(action.message, action.place);
                break;
            case "event_uno":
                this.inter.afficherMessage("UNO !", action.nb_place);
                break;
            case "event_contre_uno":
                this.inter.afficherMessage("Contre UNO !", action.nb_place);
                break;
        }
    }
    var moteur = this;
    window.setTimeout(function() {
        moteur.execAction();
    }, tempo);
}

/**
 * Met à jour l'id du dernier evenement si supérieur
 */
Moteur.prototype.updateEvenement = function(idEvenement) {
    if(idEvenement>this.dernierEvenement) this.dernierEvenement = idEvenement;
}

/**
 * Demande de login
 */
Moteur.prototype.login = function(nomJoueur) {
    this.io.pushActionConnecterServeur(nomJoueur);
}

/**
 * Créé une partie
 */
Moteur.prototype.creerPartie = function(nomPartie) {
    this.io.pushActionCreerPartie(nomPartie);
}

/**
 * Lance le chargement d'une partie
 */
Moteur.prototype.chargerPartie = function(idPartie) {
    this.io.pushActionRejoindrePartie(idPartie);
    this.inter.afficherChargement();
    this.etat = "chargement_partie";
    this.idPartie = idPartie;
}

/**
 * Lance le chargement d'une partie
 */
Moteur.prototype.poserCarte = function(idCarte) {
    this.io.pushActionPoserCarte(idCarte);
}

Moteur.prototype.piocher = function() {
    this.io.pushActionPiocher();
}

Moteur.prototype.quitterPartie = function() {
    this.etat = 'quitter_partie';
    this.inter.afficherChargement();
    this.io.pushActionQuitterPartie();
}

/**
 * Lance une partie
 */
Moteur.prototype.commencerPartie = function() {
    this.io.pushActionCommencerPartie();
}

/**
 * Choix couleur
 */
Moteur.prototype.choixCouleur = function(couleur) {
    this.io.pushActionChoixCouleur(couleur);
}

/**
 * UNO !
 */
Moteur.prototype.direUno = function() {
    this.io.pushActionUno();
}

/**
 * ContreUNO !
 */
Moteur.prototype.direContreUno = function(idJoueur) {
    this.io.pushActionContreUno(idJoueur);
}

/**
 * Envoyer un message
 */
Moteur.prototype.envoyerMessage = function(message) {
    this.io.pushActionMessage(message);
}